package com.tencent.externalstoragebar.view;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RadialGradient;
import android.graphics.RectF;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.view.View;

import com.tencent.externalstoragebar.publicthing.PublicData;


//显示视图
public class RevealView extends View {
    private Paint paint;
    private Paint progressPaint;
    private float progress = 0f;
    private boolean isAnimating = false;

    public RevealView(Context context) {
        super(context);
        init();
    }

    public RevealView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public RevealView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        // 初始化绘制完整圆形的画笔，设置为空心
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setStyle(Paint.Style.STROKE); // 设置为空心
        paint.setStrokeWidth(PublicData.r - PublicData.rIn); // 设置边框宽度

        // 创建一个从中心到边缘的渐变效果
        int[] colors = {PublicData.color, Color.argb(128, 0, 255, 0), Color.TRANSPARENT}; // 黄色到半透明白色到完全透明
        float[] positions = {0f, 0.5f, 1f}; // 渐变位置，从完全不透明到半透明到完全透明
        Shader shader = new RadialGradient(
                PublicData.r, PublicData.r, // 渐变中心（圆心），这里假设绘制在Canvas的中心
                Math.max(PublicData.r, PublicData.rIn), // 渐变半径，使用外圆半径
                colors,
                positions,
                Shader.TileMode.CLAMP // 渐变模式，CLAMP表示在边界处截断
        );
        paint.setShader(shader); // 将渐变设置为画笔的Shader

        // 如果你想要设置透明度，可以直接在颜色值中设置（例如上面的Color.argb）
        // paint.setAlpha(PublicData.alpha); // 这里不需要再设置透明度，因为已经在渐变颜色中考虑了

        // 初始化绘制进度扇形的画笔，也设置为空心
        progressPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        progressPaint.setColor(Color.TRANSPARENT); // 初始颜色设置为透明
        progressPaint.setStyle(Paint.Style.STROKE);
        progressPaint.setStrokeWidth(70); // 这里你可能希望与完整圆形的边框宽度保持一致，但也可以根据需要调整

        // 如果你也想给进度扇形添加渐变效果，可以类似地为progressPaint设置Shader
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int width = getWidth();
        int height = getHeight();
        int minSize = Math.min(width, height);
        float radius = minSize / 2f - paint.getStrokeWidth() / 2; // 减去边框宽度的一半，以确保边框不会超出视图边界

        // 绘制完整的空心圆形边框
        canvas.drawCircle(width / 2, height / 2, radius, paint);

        if (isAnimating) {
            float sweepAngle = progress * 360f;

            // 使用PorterDuff模式清除部分扇形内部，以显示进度效果
            progressPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
            RectF rectF = new RectF(0, 0, width, height);
            rectF.inset(paint.getStrokeWidth() / 2, paint.getStrokeWidth() / 2); // 考虑到边框宽度，对矩形进行内缩
            canvas.drawArc(rectF, -90, sweepAngle, false, progressPaint); // false表示不绘制扇形边框
            progressPaint.setXfermode(null); // 重置Xfermode
        }
    }

    public void startAnimation() {
        if (!isAnimating) {
            isAnimating = true;
            ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f);
            animator.setDuration(1000); // 1秒钟
            animator.addUpdateListener(animation -> {
                progress = (float) animation.getAnimatedValue();
                invalidate(); // 请求重绘
            });
            animator.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    super.onAnimationEnd(animation);
                    isAnimating = false;
                    progress = 0f;
                    invalidate(); // 请求重绘，恢复完整的圆形边框
                }

                @Override
                public void onAnimationCancel(Animator animation) {
                    super.onAnimationCancel(animation);
                    //这里是动画取消

                }
            });
            animator.start(); // 开始动画
        }
    }
}

